home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / hard / hack / i2clib40.lha / i2clib40 / src / VPS.c < prev   
C/C++ Source or Header  |  1997-08-24  |  7KB  |  259 lines

  1. /*========================================================================*
  2.  |  Datei: VPS.c                                      Datum: 17 Aug 1997  |
  3.  *------------------------------------------------------------------------*
  4.  |  Überwacht das ausgestrahlte VPS-Signal mittels SAA 4700 am I²C-Bus.   |
  5.  |  VPS-Zeit wird auch gleich mittels SAA 1064 auf LEDs angezeigt.        |
  6.  |                                                                        |
  7.  *========================================================================*/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <limits.h>
  13. #include <proto/exec.h>
  14. #include <proto/dos.h>
  15. #include <proto/i2c.h>
  16. #include <libraries/i2c.h>
  17. #include "LED.h"
  18.  
  19. struct Library *I2C_Base;
  20.  
  21.  
  22. #define SAA4700 0x20
  23.  
  24. struct VpsInfo
  25. {
  26.   BYTE bBereich;                /* 0..3 */
  27.   BYTE bLand;                   /* 0..15 */
  28.   BYTE bSender;                 /* 0..63 */
  29.   STRPTR strName;
  30. };
  31.  
  32.  
  33. /* globale Tabellen: */
  34.  
  35. STRPTR straAudio[4] =
  36. {
  37.   "?", "M", "S", "2"
  38. };
  39.  
  40. STRPTR straFsk[4] =
  41. {
  42.   "X0", "JF", "X2", "X3"
  43. };
  44.  
  45. #define ANZSENDER 29
  46.  
  47. struct VpsInfo viaSender[ANZSENDER] =
  48. {
  49.   { 3, 13,  1, "ARD" },
  50.   { 3, 13,  2, "ZDF" },
  51.   { 3, 13,  3, "ARD+ZDF" },
  52.   { 3, 13,  4, "ARD/N" },
  53.   { 3, 13,  7, "3sat" },
  54.   { 3, 13,  8, "Phoenix" },
  55.   { 3, 13,  9, "Kinderkanal" },
  56.   { 3, 13, 11, "Bayern 3" },
  57.   { 3, 13, 20, "Nord 3" },
  58.   { 3, 13, 32, "Südwest 3" },
  59.   { 3, 13, 37, "ARD/W" },
  60.   { 3, 13, 38, "WDR" },
  61.   { 3, 13, 62, "MDR" },
  62.   { 2, 13,  5, "arte" },
  63.   { 2, 13, 10, "Super RTL" },
  64.   { 2, 13, 12, "n-tv" },
  65.   { 2, 13, 13, "DSF" },
  66.   { 2, 13, 14, "Vox" },
  67.   { 2, 13, 15, "RTL 2" },
  68.   { 2, 13, 17, "Eurosport" },
  69.   { 2, 13, 18, "Kabel 1" },
  70.   { 2, 13, 20, "Pro 7" },
  71.   { 2, 13, 43, "RTL" },
  72.   { 2, 13, 44, "Premiere" },
  73.   { 2, 13, 57, "Sat 1" },
  74.   { 2, 13, 58, "tm 3" },
  75.   { 2,  4,  2, "Teleclub" },
  76.   { 1, 13, 63, "H·O·T" },
  77.   { 1, 14, 62, "Nickelodeon" },
  78. };
  79.  
  80.  
  81. void LedShow( ULONG ulCode )
  82. /* VPS-Zeit bzw. Sondercodes am LED-Display anzeigen */
  83. {
  84.   WORD wTag, wMonat, wStunde, wMinute;
  85.   BYTE baBuf[5];
  86.  
  87.   if( ulCode == ULONG_MAX )
  88.     SendLed( "----" );
  89.   else
  90.     {
  91.       wTag    = (ulCode >> 25) % 32;
  92.       wMonat  = (ulCode >> 21) % 16;
  93.       wStunde = (ulCode >> 16) % 32;
  94.       wMinute = (ulCode >> 10) % 64;
  95.       switch( wStunde )
  96.         {
  97.           case 31:
  98.             SendLed( "S---" );  /* Statuscode */
  99.             break;
  100.           case 30:
  101.             SendLed( "L---" );  /* Leercode */
  102.             break;
  103.           case 29:
  104.             SendLed( "P---" );  /* Pause */
  105.             break;
  106.           default:
  107.             sprintf( baBuf, "%2d%02d", wStunde, wMinute );
  108.             SendLed( baBuf );
  109.         }
  110.     }
  111. }
  112.  
  113.  
  114. void FileShow( ULONG ulCode0, ULONG ulCode1, FILE* Datei )
  115. {
  116.   WORD wTag, wMonat, wStunde, wMinute;
  117.   WORD wBereich, wLand, wSender, wAudio, wFsk;
  118.   WORD wLauf;
  119.   struct DateStamp dsJetzt;
  120.  
  121.   if( !Datei )
  122.     return;
  123.   DateStamp( &dsJetzt );
  124.   fprintf( Datei, "%2ld:%02ld:%02ld - ", dsJetzt.ds_Minute / 60,
  125.         dsJetzt.ds_Minute % 60, dsJetzt.ds_Tick / TICKS_PER_SECOND );
  126.   if( ulCode0 == ULONG_MAX )
  127.     fprintf( Datei, "kein VPS-Signal\n" );
  128.   else
  129.     {
  130.       wBereich =  ulCode0 >> 30;
  131.       wTag     = (ulCode0 >> 25) % 32;
  132.       wMonat   = (ulCode0 >> 21) % 16;
  133.       wStunde  = (ulCode0 >> 16) % 32;
  134.       wMinute  = (ulCode0 >> 10) % 64;
  135.       wLand    = (ulCode0 >>  6) % 16;
  136.       wSender  =  ulCode0        % 64;
  137.       wAudio   =  ulCode1 >> 30;
  138.       wFsk     = (ulCode1 >> 28) %  4;
  139.       switch( wStunde )
  140.         {
  141.           case 31:
  142.             fprintf( Datei, "%-20s", "Statuscode" );
  143.             break;
  144.           case 30:
  145.             fprintf( Datei, "%-20s", "Leercode" );
  146.             break;
  147.           case 29:
  148.             fprintf( Datei, "%-20s", "Pause" );
  149.             break;
  150.           default:
  151.             fprintf( Datei, "VPS %2d:%02d am %02d.%02d. ",
  152.                 wStunde, wMinute, wTag, wMonat );
  153.         }
  154.       fprintf( Datei, "%s, %s, ", straFsk[wFsk], straAudio[wAudio] );
  155.       fprintf( Datei, "A%d/L%02d/P%02d", wBereich, wLand, wSender );
  156.       for( wLauf = 0; wLauf < ANZSENDER; wLauf++ )
  157.         if( viaSender[wLauf].bBereich == wBereich
  158.          && viaSender[wLauf].bLand    == wLand
  159.          && viaSender[wLauf].bSender  == wSender )
  160.           break;
  161.       if( wLauf < ANZSENDER )
  162.         fprintf( Datei, ": %s", viaSender[wLauf].strName );
  163.       fprintf( Datei, "\n" );
  164.     }
  165. }
  166.  
  167.  
  168. void LibClose( struct Library **ppLib )
  169. {
  170.   if( *ppLib )
  171.   {
  172.     CloseLibrary( *ppLib );
  173.     *ppLib = NULL;
  174.   }
  175. }
  176.  
  177.  
  178. struct Library* LibOpen( STRPTR strName, LONG lVersion )
  179. {
  180.   struct Library* pLib;
  181.  
  182.   pLib = OpenLibrary( strName, lVersion );
  183.   if( !pLib )
  184.     {
  185.       printf( "Can't open %s", strName );
  186.       printf( lVersion ? " V%ld+\n" : "\n", lVersion );
  187.       exit( 10 );
  188.     }
  189.   else
  190.     return pLib;
  191. }
  192.  
  193.  
  194. void CleanUp()
  195. {
  196.   SendLed( "    " );
  197.   LibClose( &I2C_Base );
  198.   LibClose( (struct Library **)&DOSBase );
  199. }
  200.  
  201.  
  202. int main(int argc, char *argv[])
  203. {
  204.   FILE *Datei;
  205.   STRPTR strName;
  206.   WORD wRetry;
  207.   ULONG ulaVpsData[2];
  208.   ULONG ulLastData, ulLastValid;
  209.   ULONG ulError, ulLastError;
  210.  
  211.   DOSBase  = NULL;
  212.   I2C_Base = NULL;
  213.   atexit( CleanUp );            /* Librarys bei Ctrl-C mitschließen */
  214.   I2C_Base = LibOpen( "i2c.library", 39 );
  215.   DOSBase  = (struct DosLibrary *)LibOpen( "dos.library", 0 );
  216.   printf( "VPS-Signalüberwachung. Abbruch mit Ctrl-C\n" );
  217.   if( argc<2 )
  218.     strName = "RAM:VPSdatei";
  219.   else
  220.     strName = argv[1];
  221.   printf( "Ausgabedatei: \"%s\"\n", strName );
  222.   ulLastData = 0;
  223.   ulLastValid = 0;
  224.   ulLastError = 0;
  225.   while( TRUE )                 /* Tja, Ctrl-C benutzen :^) */
  226.     {
  227.       wRetry = 25;  /* erst nach 2 * 1/2 Sekunde 'kein VPS-Signal' aufgeben */
  228.       do
  229.         {
  230.           ulError = ReceiveI2C( SAA4700, 5, (char *)ulaVpsData );
  231.           if( (ulError & 0xFF) == 0 )
  232.             ulaVpsData[0] = ULONG_MAX;  /* entspricht "kein VPS-Empfang" */
  233.           Delay(1);             /* 1/50 sec warten */
  234.         }
  235.       while( ulaVpsData[0] == ULONG_MAX && wRetry-- );
  236.       if( ulError != ulLastError)
  237.         printf( "I²C-Bus: %s\n", I2CErrText( ulError) );
  238.       ulLastError = ulError;
  239.       if( ulaVpsData[0] == ulLastData && ulaVpsData[0] != ulLastValid )
  240.         {
  241.           ulLastValid = ulaVpsData[0];
  242.           FileShow( ulaVpsData[0], ulaVpsData[1], stdout );
  243.           Datei = fopen( strName, "a" );
  244.           FileShow( ulaVpsData[0], ulaVpsData[1], Datei );
  245.           fclose( Datei );
  246.           SendLed( "    ");     /* Display kurz blinken lassen */
  247.           Delay( 10 );
  248.           LedShow( ulaVpsData[0] );
  249.         }
  250.       Delay( 5 );               /* 10 Meßwerte pro Sekunde reichen */
  251.       ulLastData = ulaVpsData[0];
  252.       printf( "\r" );
  253.       fflush( stdout );         /* Ctrl-C-Abfrage erzwingen */
  254.     }
  255.  
  256.   return 0;
  257. }
  258.  
  259.